home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
ms_dos
/
filcp
/
filcp.c
next >
Wrap
Text File
|
1993-11-30
|
5KB
|
195 lines
/*-------------------------------------------------------------*/
/* FILCP.C FILE COPY v1.00 93/08/01 */
/*-------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>
#include <process.h>
void filecopy(char *infile, char *otfile);
void errmes_exit(void);
int seekchr(const char *moji, char cr);
long int dskchk(int dv_no);
union REGS inregs,outregs;
struct SREGS segregs;
struct find_t f;
int cnt=0,dno;
long int fi_size;
long int fo_size;
main(int argc, char *argv[])
{
int i,j,noi,ci0,ci1,ci2;
char fin_name[40];
char fin1_name[40];
char fin2_name[40];
char dv_name;
char fo_name[40];
char *fot_name;
char fot1_name[40];
char f_name[40];
if(argc<3) errmes_exit();
strcpy(fo_name,argv[argc-1]);
if(fo_name[1] != ':') errmes_exit();
fot_name=&fo_name[0];
dv_name=toupper(fo_name[0]);
dno=(int)dv_name-0x41;
if(fot_name[strlen(fot_name)-1] !='\\') strcat(fot_name,"\\");
printf("\n many files copy utility v1.00 by m.i \n\n");
for(i=1;i<argc-1;i++)
{
noi=0,ci0=0,ci1=0,ci2=0,j=0;
strcpy(fin_name,argv[i]);
noi=strlen(fin_name);
ci0=seekchr(fin_name,'\\');
ci1=seekchr(fin_name,':');
if(ci0<noi)
{
strncpy(fin1_name,fin_name,ci0+1);
fin1_name[ci0+1]='\0';
}
else if(ci1<noi){
strncpy(fin1_name,fin_name,ci1+1);
fin1_name[ci1+1]='\0';
}
else {
fin1_name[0]='\0';
}
while (1){
if (j==0)
{
if((_dos_findfirst(argv[i],0x16,&f))!=0)
{
printf("\a\ninput %-20s ファイルが存在しません\n",argv[i]);
break;
}
}
else if((_dos_findnext(&f))!=0) break;
j++;
strcpy(fot1_name,fot_name);
strcpy(fin2_name,fin1_name);
strcat(fin2_name,f.name);
fi_size=f.size;
filecopy(fin2_name,fot1_name);
}
}
printf("\n %d 個のファイルをコピーしました。\n",cnt);
printf(" %c : は %ld バイトが使用可\能\です \n",dno+0x41,dskchk(dno));
}
void filecopy(char *infile, char *otfile)
{
FILE *fi;
FILE *fo;
char *f_name;
char f_name1[40];
char f_name2[40];
char cmnd[80];
int ch,no=0,c0=0,c1=0;
if((fi=fopen(infile,"rb")) == NULL)
{
printf("\ninput %-20s がオープンできません\n",infile);
return ;
}
strcpy(f_name1,infile);
no=strlen(f_name1);
c0=seekchr(f_name1,'\\');
c1=seekchr(f_name1,':');
if(c0<no)
{
f_name=&f_name1[c0+1];
}
else if(c1<no){
f_name=&f_name1[c1+1];
}
else{
f_name=&f_name1[0] ;
}
strcat(otfile,f_name);
if((fo=fopen(otfile,"rb")) != NULL)
{
printf("\noutput %-20s が既に存在しています\n",otfile);
fclose(fi);
fclose(fo);
return ;
}
fo_size=dskchk(dno);
if(fi_size>=fo_size)
{
printf("\a\n !! DISK がいっぱいです。 !! \n");
printf(" コピーを終了します。 \n");
printf("\n %d 個のファイルをコピーしました。\n",cnt);
exit(1);
}
if((fo=fopen(otfile,"wb")) == NULL)
{
printf("\noutput %-20s がオープンできません\n",otfile);
fclose(fi);
return ;
}
printf("\ncopy %-20s -> %-20s \n",infile,otfile);
if(f.attrib & _A_HIDDEN)
{
while((ch=getc(fi)) !=EOF) putc(ch,fo);
printf(" hidden file 1個をコピーしました. \n");
fclose(fi);
fclose(fo);
cnt++;
return;
}
else{
fclose(fi);
fclose(fo);
strcpy(cmnd,"copy ");
strcat(cmnd,infile);
strcat(cmnd," ");
strcat(cmnd,otfile);
system(cmnd);
cnt++;
}
}
int seekchr(const char *moji, char c)
{
int i,len;
len=strlen(moji);
for(i=len;i>=0;i--)
{
if(moji[i]==c) return i;
}
return len;
}
long int dskchk(int dv_no)
{
inregs.h.ah=0x36;
inregs.h.dl=dv_no+1;
intdos(&inregs,&outregs);
return((long)outregs.x.ax*outregs.x.bx*outregs.x.cx);
}
void errmes_exit(void)
{
printf("使用方法:\n\n");
printf("filcp ファイル1 ファイル2 ファイル3 ・・・ コピー先ドライブ\n\n");
printf(" 複数のファイルをコピー先ドライブにコピーします。\n");
printf(" コピー先ディレクトリを省略するとルートディレクトリにコピーされます。\n");
printf(" 同名のファイルがコピー先にあった場合は、コピーしません。\n");
printf(" ワイルドカードも使用できます。\n\n");
printf("ex; F>filcp a:aaa.exe a:aaa.c d:*.doc e:?bb.dat a:ccc.* b:[\\xxx]\n\n");
exit(1);
}